package com.basics.common.utils;

import com.alibaba.fastjson.JSONObject;
import com.basics.common.utils.http.HttpUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 微信小程序接口实现身份证OCR识别
 * @Author WangWei
 * @Date 2021/11/4 12:42
 * @Version 2.0
 * @Description
 **/
public class IdCardUtils {
   private static Logger logger = LoggerFactory.getLogger(IdCardUtils.class);

    private static final String OCR_URL = "https://api.weixin.qq.com/cv/ocr/idcard";

    private static final String ID_CARD_CHECK_URL = "https://zidv2.market.alicloudapi.com/idcheck/Post";

    private static final String AppCode = "";
    public static JSONObject ocrIdCard(String access_token,String imgUrl){
        String result = HttpUtils.sendPost(OCR_URL,"type=photo&img_url="+imgUrl+"&access_token="+access_token);
        if(StringUtils.isNotEmpty(result)){
            return JSONObject.parseObject(result);
        }
        return null;
    }

    public static JSONObject getIdCardData(String idCardNo,String name){
        Map<String, String> bodys = new HashMap<>();
        bodys.put("cardNo", idCardNo);
        bodys.put("realName", name);
        String result = IdCardHttpUtils.sendPostMap(ID_CARD_CHECK_URL,bodys,AppCode);
        logger.error("身份证二要素校验信息:"+result);
        if(StringUtils.isNotEmpty(result)){
            return JSONObject.parseObject(result);
        }
        return null;
    }

    /**
     *
     * @param idCardNo
     * @param name
     * @return 返回4种状态  0: 一致，1:  不一致，2:  查无记录 3 查询失败
     *
     *温馨提示：
     *出现'查无记录'时，有以下几种原因
     *(1)现役军人、武警官兵、特殊部门人员及特殊级别官员；
     *(2)退役不到2年的军人和士兵（根据军衔、兵种不同，时间会有所不同，一般为2年）；
     *(3)户口迁出，且没有在新的迁入地迁入；
     *(4)户口迁入新迁入地，当地公安系统未将迁移信息上报到公安部（上报时间地域不同而有所差异）；
     *(5)更改姓名，当地公安系统未将更改信息上报到公安部（上报时间因地域不同而有所差异）；
     *(6)移民；
     *(7)未更换二代身份证；
     *(8)死亡。
     */
    public static boolean checkIdCard(String idCardNo,String name){
        JSONObject jo = getIdCardData(idCardNo,name);
        if(jo==null){
            /**
             * 查询失败
             */
            return false;
        }
        if(!"0".equals(jo.getString("error_code"))){
            /**
             * 查询失败
             */
            return false;
        }
        return jo.getJSONObject("result").getBoolean("isok");
    }

    /**
     * 根据身份证号判断性别
     * @param idNumber
     * @return
     */
    public static int judgeGender(String idNumber) throws IllegalArgumentException{
        if(idNumber.length() != 18 && idNumber.length() != 15){
            throw new IllegalArgumentException("身份证号长度错误");
        }
        int gender = 0;
        if(idNumber.length() == 18){
            //如果身份证号18位，取身份证号倒数第二位
            char c = idNumber.charAt(idNumber.length() - 2);
            gender = Integer.parseInt(String.valueOf(c));
        }else{
            //如果身份证号15位，取身份证号最后一位
            char c = idNumber.charAt(idNumber.length() - 1);
            gender = Integer.parseInt(String.valueOf(c));
        }
        if(gender % 2 == 1){
            return 1;
        }else{
            return 2;
        }
    }

    /**
     * 根据身份证的号码算出当前身份证持有者的年龄
     *
     * @return
     */
    public static int countAge(String idNumber) {
        if(idNumber.length() != 18 && idNumber.length() != 15){
            throw new IllegalArgumentException("身份证号长度错误");
        }
        String year;
        String yue;
        String day;
        if(idNumber.length() == 18){
            year = idNumber.substring(6).substring(0, 4);// 得到年份
            yue = idNumber.substring(10).substring(0, 2);// 得到月份
            day = idNumber.substring(12).substring(0,2);//得到日
        }else{
            year = "19" + idNumber.substring(6, 8);// 年份
            yue = idNumber.substring(8, 10);// 月份
            day = idNumber.substring(10, 12);//日
        }
        Date date = new Date();// 得到当前的系统时间
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String fyear = format.format(date).substring(0, 4);// 当前年份
        String fyue = format.format(date).substring(5, 7);// 月份
        String fday=format.format(date).substring(8,10);//
        int age = 0;
        if(Integer.parseInt(yue) == Integer.parseInt(fyue)){//如果月份相同
            if(Integer.parseInt(day) <= Integer.parseInt(fday)){//说明已经过了生日或者今天是生日
                age = Integer.parseInt(fyear) - Integer.parseInt(year);
            } else {
                age = Integer.parseInt(fyear) - Integer.parseInt(year) - 1;
            }
        }else{

            if(Integer.parseInt(yue) < Integer.parseInt(fyue)){
                //如果当前月份大于出生月份
                age = Integer.parseInt(fyear) - Integer.parseInt(year);
            }else{
                //如果当前月份小于出生月份,说明生日还没过
                age = Integer.parseInt(fyear) - Integer.parseInt(year) - 1;
            }
        }
        return age;
    }


    public static void main(String[] args) {
        checkIdCard("420325199102283914","王伟");
    }

}
